package com.tedu.api.io;

import com.sun.deploy.nativesandbox.NativeSandboxOutputStream;
import org.junit.Test;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.security.IdentityScope;
import java.sql.SQLOutput;

/**
 * 位于java.io
 * RandomAccessFileAPI
 * 专门解决File无法实现读写的操作类【数据传递】,底层使用C完成
 * 【使用方法并不方便】----知道
 * RandomAccessFile构造器使用
 * RandomAccessFile方法的使用：读、写、操作
 * 音乐复制粘贴
 */
public class RandomAccessFileAPI {
    @Test
    public void testWrite() throws IOException {
        //创建类  在API下 创建raf.txt文件  模式:读写
        RandomAccessFile raf = new RandomAccessFile/*叉出去*/
                ("raf.txt", "rw");//rw读写操作
        /**
         * write()作用:写出一个字节,将给定的int值对应二进制"低八位"写出
         * 范围:0~~255之间写入ASCII码【接近底层】
         * 有异常叉出去
         */
        raf.write(25);
        raf.write(25);
        raf.write(25);//叉出去 添加到签名  io型异常  A
        raf.close();
        //关闭   流   closed()
        System.out.println("坤");

    }

    @Test
    public void testRead() throws IOException {
        //创建RAF---模式--读
        RandomAccessFile raf = new
                RandomAccessFile("raf.txt", "r");//叉出去
        /**
         * read()
         * 作庸:读取一个字节,返回是一个十进制   返回值-1  读完啦
         */
        int i = raf.read();
        int i1 = raf.readByte();//顺序别错
        int i2 = raf.read();
        int i3 = raf.read();
        //叉出去  返回值:int类型
        System.out.println("🐓" + i + "🐓" + i1 + "🐓" + i2 + "🐓" + i3 + "🐓");

    }

    //搞音乐
    @Test
    public void testCopy() throws IOException {
        //被复制文件--复制操作   复制出来的文件--粘贴操作
        RandomAccessFile raf = new
                RandomAccessFile("927736cd2f6fa45704315f8fb21fef61.mp4", "r");
        RandomAccessFile ra = new
                RandomAccessFile("927736cd2f6fa45704315f8fb21fef61.mp4", "rw");
        //创建int类型的变量  用于保存读取的数据的每个字节  读取写出
        int temp = -1;//直接给值  读到-1代表文件读完了
        //一个一个字节读---一个一个字节写  测运行效果
        long sta = System.currentTimeMillis();//long表示时间  获取时间  毫秒
        //需要从"歌"--读到的每个字节--写到新卢浮宫
        //一直从"鸽鸽"读到所有字节

        while ((temp = raf.read()) != -1) {//叉出去  有数据就一直:true
            // 从"鸽鸽"读到所有字节,只要不是末尾(-1)，一直读  写出新鸽鸽每个字节
            ra.write(temp);//读入temp的数据写出 write中
        }
        long st = System.currentTimeMillis();//获取系统时间  毫秒
        //关闭流派
        raf.close();
        ra.close();
        //测读取花费的时间
        System.out.println("读取花的时间" + (st - sta) / 1000);//加括号让憨皮系统能够正确识别


    }

    /**
     * 需求:实现视频 C V 复制粘贴
     * 读写按照1个字节操作--效率低
     * 1024 程序员劫
     * 1字节=8位二进制
     * 0   0000   0000
     * 1   0000   0001
     * 2   0000   0010
     * 6   0000   0110
     */
    @Test
    public void testRM() throws IOException {
        //1.被复制的文件---视频--占用内存空间大
        RandomAccessFile src=new RandomAccessFile("a90ccffd353fdd174dabb10cf82eedcd.mp4","r");
        //1.复制的文件---视频.mp4
        RandomAccessFile desc=new RandomAccessFile("a90ccffd353fdd174dabb10cf82eedcd.mp4","rw");
        //2.保存每次读取的字节量
        int len=-1;
        /**重载
         * read()一个字节一个字节读
         * read(字节数组)实现根据自己指定的100KB方式读取字节
         */
        //3.定义字节数组---100KB
        byte[] data=new byte[1024*100];
        //4.开始一直从"复制文件.mp4"读取
        //(len=src.read(data))!=-1 判断条件
        while ((len=src.read(data))!=-1){
            /**重载
             * write(int i) 写出一个字节
             * write(字节数组,读取开始：0，读取结束：-1)
             * 作用：写出"字节数组：指定大小100KB"的文件
             *      从0开始，写出到-1结束
             */
            //5.按照100KB 写出"视频.mp4"文件
            desc.write(data,0,len);

            //6.关闭流
            src.close();
            //7.自己测复制的时间


        }
    }
}
